1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| this.drawPayQRCode({ qrImgUrl: '二维码地址', logoImgUrl: '支付通道的 logo', sum: '金额', userLoginName: '用户名', branchName: '彩店名', payproductName: '支付通道名', tipList: ['文案 1','文案 2','文案 3'], callback: function(canvas) { const imgUrl = canvas.toDataURL('image/png'); } });
drawPayQRCode(options) { const canvas = document.createElement('canvas'); const canvasWidth = 280; const canvasHeight = 270; canvas.width = canvasWidth; canvas.height = canvasHeight; const context = canvas.getContext('2d');
context.fillStyle = '#fff'; context.fillRect(0, 0, canvasWidth, canvasHeight);
const qrL = (280 - 150) / 2; const qrR = 26; const qrWH = 150; const logoL = (280 - 24) / 2; const logoR = 89; const logoWH = 24;
const qrImg = new Image(); if (CONFIG.browser.ios) { this.fetchImage(options.qrImgUrl, function(myBlob) { const objectURL = URL.createObjectURL(myBlob); qrImg.src = objectURL;
setTimeout(function() { if (qrImg.complete) { context.drawImage(qrImg, qrL, qrR, qrWH, qrWH); }
const logoImg = new Image(); this.fetchImage(options.logoImgUrl, function(myBlob) { const objectURL = URL.createObjectURL(myBlob); logoImg.src = objectURL; setTimeout(function() { if (logoImg.complete) { context.drawImage(logoImg, logoL, logoR, logoWH, logoWH); options.callback(canvas); } }, 60); }); }, 60); }); } else { qrImg.setAttribute('crossOrigin', 'Anonymous');
qrImg.onload = function() { context.drawImage(qrImg, qrL, qrR, qrWH, qrWH); const logoImg = new Image(); logoImg.setAttribute('crossOrigin', 'Anonymous');
logoImg.onload = function() { context.drawImage(logoImg, logoL, logoR, logoWH, logoWH); options.callback(canvas); }; logoImg.src = options.logoImgUrl; }; qrImg.src = options.qrImgUrl; }
context.font = '12px Helvetica Neue,Tahoma,Arial,PingFangSC-Regular,Hiragino Sans GB,Microsoft Yahei,sans-serif';
context.fillStyle = '#f00'; context.textAlign = 'center'; context.fillText(`¥${options.sum}`, 140, 26 + 150 + 10); context.fillText(`仅限${options.userLoginName} ${options.branchName}使用`, 140, 26 + 150 + 25);
context.fillStyle = '#000'; context.textAlign = 'left'; const tipList = options.tipList;
if (options.payproductName === 'WECHAT') { tipList[0] = '请打开微信 APP 扫一扫'; tipList.splice(2, 0, '请勿在扫码页面从相册选取二维码进行识别'); }
const len = tipList.length; for (let i = 0; i < len; i++) { context.fillText(i + 1 + '.' + tipList[i] + (i === len - 1 ? '。' : ';'), 16, 220 + 16 \* i); } }, fetchImage(imgUrl, cb) { fetch(imgUrl) .then(function(res) { if (res.ok) { return res.blob(); } }) .then(function(myBlob) { cb(myBlob); }); },
|